package com.ang.jdk8.stream;

import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class SortTest {
    public static void main(String[] args) {
        SortTest sortTest = new SortTest();
        sortTest.test01();
    }

    /**
     * 需要用list接受一下，.sorted()不会改变原有的list
     */
    public void test01(){
        List<User> list = getList();
        List<User> list1 = getList();
        list.addAll(list1);

        //按age升序，默认就是升序
        System.out.println("--------------按age升序-------------");
        list = list.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
        list.forEach(l->{
            System.out.println(JSON.toJSONString(l));
        });

        //按age降序，降序2种写法
        //方法1：按age升序，升序后的结果反转（降序）
        System.out.println("--------------按age降序，写法1-------------");
        list = list.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());
        list.forEach(l->{
            System.out.println(JSON.toJSONString(l));
        });
        //方法2：按照age降序
        System.out.println("--------------按age降序，写法2-------------");
        list = list.stream().sorted(Comparator.comparing(User::getAge, Comparator.reverseOrder())).collect(Collectors.toList());
        list.forEach(l->{
            System.out.println(JSON.toJSONString(l));
        });


        //先按id升序，在按age升序
        System.out.println("--------------先按id升序，在按age降序-------------");
        list = list.stream().sorted(Comparator.comparing(User::getId).thenComparing(User::getAge, Comparator.reverseOrder())).collect(Collectors.toList());
        list.forEach(l->{
            System.out.println(JSON.toJSONString(l));
        });

        //按照name倒序，如果name为null，放在第一个（先升序再反转）
        System.out.println("--------------name倒序，如果name位null，则放入第一个-------------");
        list = list.stream().sorted(Comparator.comparing(User::getName, Comparator.nullsLast(String::compareTo)).reversed()).collect(Collectors.toList());
        list.forEach(l->{
            System.out.println(JSON.toJSONString(l));
        });
    }

    //获取list
    public List<User> getList(){
        List<User> list = new ArrayList<>();
        IntStream.range(1,10).forEach(i->{
            int age = new Random().nextInt(25);
            User u = new User(i,"t"+i, age);
            if(i % 5 == 0){
                u.setName(null);
            }
            list.add(u);
        });

        return list;
    }


    @Data
    @AllArgsConstructor
    class User{
        private Integer id;
        private String name;
        private Integer age;
    }
}
